#!/usr/bin/env python3
# -*- coding: utf-8 -*-

"""
浮点数生成工具模块
提供生成指定整数位数和小数位数的浮点数功能
"""

import random
import secrets
import string
import sys
import os
from typing import Union

# 尝试导入Python-Common-Tools中的工具类
try:
    sys.path.insert(0, os.path.join(os.path.dirname(__file__), '../../Python-Common-Tools'))
    from com.tools.Data_Utils.data_utils import DataUtils
    DATA_UTILS_AVAILABLE = True
except ImportError:
    DataUtils = None
    DATA_UTILS_AVAILABLE = False


class FloatGenerator:
    """
    浮点数生成器类
    提供生成具有指定整数位数和小数位数的浮点数的方法
    """

    @staticmethod
    def generate_random_float(integer_digits: int, decimal_digits: int) -> float:
        """
        生成具有指定整数位数和小数位数的随机浮点数

        :param integer_digits: 整数部分位数 (>0)
        :param decimal_digits: 小数部分位数 (>=0)
        :return: 具有指定精度的随机浮点数
        :raises ValueError: 当参数不符合要求时抛出异常
        """
        if not DATA_UTILS_AVAILABLE:
            raise RuntimeError("无法导入Python-Common-Tools中的DataUtils模块")
        
        if integer_digits <= 0:
            raise ValueError("整数位数必须大于0")
        if decimal_digits < 0:
            raise ValueError("小数位数不能为负数")

        # 生成整数部分，完全使用DataUtils方法
        if integer_digits == 1:
            # 如果只要1位整数，则范围是0-9
            integer_part = DataUtils.generate_true_random_number(0, 9)
        else:
            # 多位整数，第一位不能为0
            first_digit = DataUtils.generate_true_random_number(1, 9)
            remaining_digits = ''.join(
                str(DataUtils.generate_true_random_number(0, 9)) 
                for _ in range(integer_digits - 1)
            )
            integer_part = int(str(first_digit) + remaining_digits)

        # 生成小数部分，完全使用DataUtils方法
        if decimal_digits == 0:
            # 如果没有小数位，直接返回整数部分
            return float(integer_part)
        else:
            # 生成指定位数的小数部分
            decimal_digits_str = ''.join(
                str(DataUtils.generate_true_random_number(0, 9))
                for _ in range(decimal_digits)
            )
            decimal_part = int(decimal_digits_str) / (10 ** decimal_digits)
            return float(integer_part + decimal_part)

    @staticmethod
    def generate_random_float_from_utils(integer_digits: int, decimal_digits: int) -> float:
        """
        基于Python-Common-Tools中的DataUtils工具生成具有指定整数位数和小数位数的随机浮点数

        :param integer_digits: 整数部分位数 (>0)
        :param decimal_digits: 小数部分位数 (>=0)
        :return: 具有指定精度的随机浮点数
        """
        if not DATA_UTILS_AVAILABLE:
            raise RuntimeError("无法导入Python-Common-Tools中的DataUtils模块")
        
        # 使用现有工具生成随机整数部分和小数部分
        if integer_digits <= 0:
            raise ValueError("整数位数必须大于0")
        if decimal_digits < 0:
            raise ValueError("小数位数不能为负数")
            
        # 生成整数部分
        if integer_digits == 1:
            integer_part = DataUtils.generate_true_random_number(0, 9)
        else:
            # 多位整数，第一位不能为0
            first_digit = DataUtils.generate_true_random_number(1, 9)
            remaining_digits = ''.join(
                str(DataUtils.generate_true_random_number(0, 9)) 
                for _ in range(integer_digits - 1)
            )
            integer_part = int(str(first_digit) + remaining_digits)
            
        # 生成小数部分
        if decimal_digits == 0:
            return float(integer_part)
        else:
            # 生成指定位数的小数部分
            decimal_digits_str = ''.join(
                str(DataUtils.generate_true_random_number(0, 9))
                for _ in range(decimal_digits)
            )
            decimal_part = int(decimal_digits_str) / (10 ** decimal_digits)
            return float(integer_part + decimal_part)